﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Generator
{
    internal class Parser
    {
        Random random;
        int testSetSize = 50;
        public Parser()
        {
            random = new Random((int)DateTime.Now.Ticks);
        }
/// <summary>
/// Конструктор, который позволяет менять размер тестового множества
/// </summary>
/// <param name="testSetSize"> Размер тестового множества в процентах от 0 до 100</param>
        public Parser(int testSetSize)
        {
            if (testSetSize<=100 && testSetSize >=0)
            {
                this.testSetSize = testSetSize;    
            }
            
            random = new Random((int)DateTime.Now.Ticks);
        }

        private bool IsInTestSet()
        {
            return (random.Next(101) < testSetSize);
        }
        /// <summary>
        /// Парсинг файлов с рейтингами и фильмами.
        /// Возвращает таблицу - основное множество и словарь 
        /// </summary>
        /// <param name="ratingsFile">путь к файлу с рейтингами</param>
        /// <param name="moviesFile">путь к файлу с фильмами</param>
        /// <param name="maxUsreID">максимальный ID юзера</param>
        /// <param name="maxMovieID">максимальный ID фильма</param>
        /// <returns></returns>
        public Tuple<int[,], Dictionary<Tuple<int, int>, int>> ParseRatings(string ratingsFile, string moviesFile, int maxUsreID, int maxMovieID)
        {
            //maximum id of movie + "0"
            //maximum id of user + "0"
            int[,] ratings = new int[maxUsreID + 1, maxMovieID + 1];
            Dictionary<Tuple<int, int>, int> TestRatings = new Dictionary<Tuple<int, int>, int>();

            string[] moviesArray = File.ReadAllLines(moviesFile);
            string[] ratingsArray = File.ReadAllLines(ratingsFile);


            //for find nonexistent movies
            int movieCounter = 0;
            int movieCounterInFile = 0;
            char[] separator = ":".ToCharArray();


            for (int i = 0; i < moviesArray.GetLength(0); i++)
            {
                //это быдлокод, я не знаю, как это сделать аккуратнее
                string[] a = moviesArray[i].Split(separator);
                Int32.TryParse(a[0], out movieCounterInFile);
                while (movieCounter != movieCounterInFile)
                {
                    
                    for (int j = 0; j < ratings.GetLength(0); j++)
                    {
                        ratings[j, movieCounter] = -1;
                    }
                    movieCounter++;
                }
                movieCounter++;
            }

            //parse ratings
            int user = 0;
            int movie = 0;
            int rating =0;
            string[] str;

            int test = 0;
            int notTest = 0;
            
            for (int i = 0; i < ratingsArray.GetLength(0); i++)
            {
                str = ratingsArray[i].Split(separator);
                Int32.TryParse(str[0], out user);
                Int32.TryParse(str[2], out movie);
                Int32.TryParse(str[4], out rating);

                
                if (IsInTestSet())
                {
                    test++;
                    TestRatings.Add(new Tuple<int, int>(user, movie), rating);
                }
                else
                {
                    notTest++;
                    ratings[user, movie] = rating;
                }
                
            }
            return new Tuple<int[,],Dictionary<Tuple<int,int>,int>>(ratings,TestRatings);

        }
    }
}
